% TODO proof-reading
\subsection{Klassen}

Einfache Klassen:

\begin{lstlisting}[caption=test.java,style=customjava]
public class test
{
        public static int a;
        private static int b;

        public test()
        {
            a=0;
            b=0;
        }
        public static void set_a (int input)
	{
		a=input;
	}
	public static int get_a ()
	{
		return a;
	}
	public static void set_b (int input)
	{
		b=input;
	}
	public static int get_b ()
	{
		return b;
	}
}
\end{lstlisting}

Der Konstruktor setzt lediglich beide Felder auf 0:

\begin{lstlisting}
  public test();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #1         // Method java/lang/Object."<init>":()V
         4: iconst_0      
         5: putstatic     #2         // Feld a:I
         8: iconst_0      
         9: putstatic     #3         // Feld b:I
        12: return        
\end{lstlisting}

Setter von \TT{a}:

\begin{lstlisting}
  public static void set_a(int);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=1, args_size=1
         0: iload_0       
         1: putstatic     #2         // Feld a:I
         4: return        
\end{lstlisting}

Getter von \TT{a}:

\begin{lstlisting}
  public static int get_a();
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: getstatic     #2         // Feld a:I
         3: ireturn       
\end{lstlisting}

Setter von \TT{b}:

\begin{lstlisting}
  public static void set_b(int);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=1, args_size=1
         0: iload_0       
         1: putstatic     #3         // Feld b:I
         4: return        
\end{lstlisting}

Getter von \TT{b}:

\begin{lstlisting}
  public static int get_b();
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: getstatic     #3         // Feld b:I
         3: ireturn       
\end{lstlisting}

Es gibt keinen Unterschied in den Codes die mit public oder private Feldern arbeiten.

Aber diese Information ist in der \TT{.class}-Datei vorhanden und es ist nicht
möglich auf die privaten Felder zuzugreifen.

Erstellen wir ein Objekt und rufen seine Methoden auf:

\begin{lstlisting}[caption=ex1.java,style=customjava]
public class ex1
{
	public static void main(String[] args)
	{
		test obj=new test();
		obj.set_a (1234);
		System.out.println(obj.a);
	}
}
\end{lstlisting}

\begin{lstlisting}
  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: new           #2        // Klasse test
         3: dup           
         4: invokespecial #3        // Methode test."<init>":()V
         7: astore_1      
         8: aload_1       
         9: pop           
        10: sipush        1234
        13: invokestatic  #4        // Methode test.set_a:(I)V
        16: getstatic     #5        // Feld java/lang/System.out:Ljava/io/PrintStream;
        19: aload_1       
        20: pop           
        21: getstatic     #6        // Feld test.a:I
        24: invokevirtual #7        // Methode java/io/PrintStream.println:(I)V
        27: return        
\end{lstlisting}

Die \TT{new}-Anweisung erstellt ein Objekt aber ruft den Konstruktor nicht auf
(dieser wird bei Offset 4 aufgerufen).

Die \TT{set\_a()}-Methode wird an Offset 16 aufgerufen.

Auf das Feld \TT{a} wird mit der \TT{getstatic}-Anweisung an Offset 21 zugegriffen.
